#ifndef UTILS_HH
#define UTILS_HH

#include <string>
#include <random>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <chrono>
#include <ctime>
#include <Windows.h>

namespace BankSystem
{
    // 提供各种工具函数
    class Utils
    {
    public:
        // 生成中国风格的银行账号
        // 格式: 62XX-YYYY-ZZZZ-AAAA
        // 62: 中国卡号前缀
        // XX: 账户类型 (21 为储蓄, 22 为支票)
        // YYYY: 分行代码 (随机生成)
        // ZZZZ-AAAA: 账户号码 (随机生成)
        static std::string generateAccountNumber(bool isSavings)
        {
            std::random_device rd;
            std::mt19937 gen(rd());
            std::uniform_int_distribution<> branchDist(1, 9999);
            std::uniform_int_distribution<> accDist(1, 9999);
            std::uniform_int_distribution<> accDist2(1, 9999);

            std::stringstream ss;
            SetConsoleOutputCP(CP_UTF8);
            ss << "62" << (isSavings ? "21" : "22") << "-"
               << std::setw(4) << std::setfill('0') << branchDist(gen) << "-"
               << std::setw(4) << std::setfill('0') << accDist(gen) << "-"
               << std::setw(4) << std::setfill('0') << accDist2(gen);

            return ss.str();
        }

        // 生成交易ID
        static std::string generateTransactionId()
        {
            SetConsoleOutputCP(CP_UTF8);
            static int transactionCounter = 0;
            transactionCounter++;

            std::stringstream ss;
            ss << "T" << std::setw(3) << std::setfill('0') << transactionCounter;
            return ss.str();
        }

        // 获取当前日期和时间的字符串表示
        static std::string getCurrentDateTime()
        {
            SetConsoleOutputCP(CP_UTF8);
            auto now = std::chrono::system_clock::now();
            std::time_t now_time = std::chrono::system_clock::to_time_t(now);

            std::tm *now_tm = std::localtime(&now_time);

            std::stringstream ss;
            ss << std::put_time(now_tm, "%Y-%m-%d %H:%M:%S");
            return ss.str();
        }

        // 获取当前日期（用于文件名）
        static std::string getCurrentDate()
        {
            SetConsoleOutputCP(CP_UTF8);
            auto now = std::chrono::system_clock::now();
            std::time_t now_time = std::chrono::system_clock::to_time_t(now);

            std::tm *now_tm = std::localtime(&now_time);

            std::stringstream ss;
            ss << std::put_time(now_tm, "%Y-%m-%d");
            return ss.str();
        }

        // 打印金额（使用人民币符号）
        static std::string formatCurrency(double amount)
        {
            std::stringstream ss;
            SetConsoleOutputCP(CP_UTF8);
            ss << "￥:" << std::fixed << std::setprecision(2) << amount;
            return ss.str();
        }
    };


    //-----------------------------------
    //各个cpp文件要用到的函数
    // 清空输入缓冲区
    void clearInputBuffer()
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }

    // 等待用户按下回车继续
    void waitForEnter()
    {

        std::cout << "\nPress Enter to continue...";
        std::cin.get();
    }
}

#endif // UTILS_H